package com.gitee.deament.server.core.cli.db.set;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * SUNIONSTORE destination key [key …]
 * 可用版本： >= 1.0.0
 * 时间复杂度: O(N)， N 是所有给定集合的成员数量之和。
 * 这个命令类似于 SUNION key [key …] 命令，但它将结果保存到 destination 集合，而不是简单地返回结果集。
 *
 * 如果 destination 已经存在，则将其覆盖。
 *
 * destination 可以是 key 本身。
 *
 * 返回值
 * 结果集中的元素数量。
 * @author deament
 */
@CliHander(command = "SUNIONSTORE")
public class SUNIONSTOREcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() < 3) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'SUNION' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;
        String destination = cliValues.get(1);
        String key = cliValues.get(2);

        Set<String> result=new HashSet<>();
        for(int i=1;i<cliValues.size();i++){
            Value<Set<String>> set = dbData.getSet(db, key);
            if(set ==null && set.getValue()==null || set.getValue().size()==0){
                continue;
            }
            result.addAll(set.getValue());

        }
        Iterator<String> iterator = result.iterator();
        Value<Set<String>> set = dbData.getSet(db, destination);
        if(set ==null && set.getValue()==null || set.getValue().size()==0){

        }else{
            set.getValue().clear();
        }
        while (iterator.hasNext()){
            dbData.setSetData(db,destination,iterator.next());
        }
        channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(result.size()+""));
        return;
    }
}
